package service

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
	"time"
	"wanfang-translation/internal/repository"
)

// TranslationConfig 翻译服务配置
type TranslationConfig struct {
	Host    string `mapstructure:"host"`
	Port    int    `mapstructure:"port"`
	Service string `mapstructure:"service"`
}

// APITranslator 实现 Translator 接口
type APITranslator struct {
	cn2enConfig TranslationConfig
	en2cnConfig TranslationConfig
	client      *http.Client
}

// TranslationRequest 翻译请求结构
type TranslationRequest struct {
	Text string `json:"text"`
}

type TranslationResponse struct {
	TranslatedText string `json:"translated_text"`
}

// NewAPITranslator 创建新的API翻译器
func NewAPITranslator(cn2enConfig, en2cnConfig TranslationConfig) *APITranslator {
	return &APITranslator{
		cn2enConfig: cn2enConfig,
		en2cnConfig: en2cnConfig,
		client: &http.Client{
			Timeout: 60 * time.Second,
		},
	}
}

// Translate 实现翻译接口
func (t *APITranslator) Translate(content string, isCn2En bool) (string, error) {
	// 选择配置
	config := t.en2cnConfig
	if isCn2En {
		config = t.cn2enConfig
	}

	// 构建请求URL
	url := fmt.Sprintf("http://%s:%d%s", config.Host, config.Port, config.Service)

	// 准备请求体
	reqBody := TranslationRequest{
		Text: content,
	}
	jsonData, err := json.Marshal(reqBody)
	if err != nil {
		return "", fmt.Errorf("序列化请求失败: %v", err)
	}

	// 创建请求
	req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
	if err != nil {
		return "", fmt.Errorf("创建请求失败: %v", err)
	}
	req.Header.Set("Content-Type", "application/json")

	// 发送请求
	resp, err := t.client.Do(req)
	if err != nil {
		return "", fmt.Errorf("发送请求失败: %v", err)
	}
	defer resp.Body.Close()

	// 解析响应
	var result repository.R[TranslationResponse]
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		return "", fmt.Errorf("解析响应失败: %v", err)
	}

	// 检查响应状态
	if resp.StatusCode != http.StatusOK {
		return "", fmt.Errorf("翻译服务返回错误: %s", result.Msg)
	}

	return result.Data.TranslatedText, nil
}
